package com.zut.util;



import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtils {

    //设置签名信息(秘钥明文)
    private static String signKey = "crowdfunding";
    //JWT有效期
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * JWT令牌由三部分组成
     * Header信息：令牌的类型和签名算法
     * Payload:令牌的第二部分是有效负载，其中包含声明。声明是有关实体（通常是用户）和其他数据的语句
     * Signature:要创建签名部分，您必须获取Header、Payload、secret以及Header中指定的算法并对其进行签名。
     * 签名用于验证消息在此过程中未被更改，并且在使用私钥签名的令牌的情况下，它还可以验证 JWT 的发件人是否是它所说的人。
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                //设置Header信息：令牌的类型和签名算法
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")
                //设置Payload信息，可以是JSON数据
                .addClaims(claims)
                //设置Signature 使用HS256对称加密算法签名，第二个参数为秘钥，根据密钥进行加密
                .signWith(SignatureAlgorithm.HS256, signKey)
                // 设置JWT的过期时间
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                //对JWT的三部分进行拼接
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        // 解密出来JWT当中存储的Payload当中的数据
        Claims claims = Jwts.parser()
                // 根据密钥进行解密
                .setSigningKey(signKey)
                // JWT对象
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}
